import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import color

web = webdriver.Edge()
web.implicitly_wait(5)
web.get('https://www.byhy.net/cdn2/files/selenium/test1.html')
# ---------------------------根据路径选择--------------------------
# 从根节点开始的，到某个节点，每层都依次写下来，每层之间用 / 分隔的表达式，就是某元素的绝对路径
# 等价于css表达式 html>body>div,直接子代
elements = web.find_elements(By.XPATH, "/html/body/div")
# '//' 符号也可以继续加在后面,比如，要选择所有的div元素里面的所有的p元素 ，不管div 在什么位置，也不管p元素在div下面的什么位置
# 相对路径, 相当于CSS表达式 div p, 后代
# 通配符 *是一个通配符，对应任意节点名的元素，等价于CSS选择器 div > *
elements = web.find_elements(By.XPATH, "//div//p")
for element in elements:
    print("---------------------")
    print(element.get_attribute("outerHTML"))

# ---------------------------根据属性选择--------------------------
# 根据属性来选择元素是通过这种格式来的 [@属性名='属性值']
# 注：如果一个元素class 有多个，比如
# <p id="beijing" class='capital huge-city'>
#     北京
# </p>
# 如果要选它，对应的xpath 就应该是 //p[@class="capital huge-city"]（写全）
# 选择 id为west的元素，可以这样
elements = web.find_elements(By.XPATH, "//*[@id='west']")
# 要选择 style属性值包含 color字符串的页面元素，可以这样
web.find_elements(By.XPATH, "//*[contains(@style,'color')]")
# 要选择 style属性值以color字符串开头的页面元素，可以这样
web.find_element(By.XPATH, "//*[starts-with(@style,'color')]")

# ---------------------------根据次序选择--------------------------
# 比如 要选择p类型第2个的子元素，就是
web.find_element(By.XPATH, "//p[2]")
# 也可以选择第2个子元素，不管是什么类型，采用通配符
# 比如选择父元素为div的第2个子元素，不管是什么类型
web.find_element(By.XPATH, "//div/*[2]")
# 当然也可以选取倒数第几个子元素
# 比如：
# 选取p类型倒数第1个子元素
web.find_element(By.XPATH, "//p[last()]")
# 选取p类型倒数第2个子元素    //p[last()-1]
# Xpath还可以选择子元素的次序范围
# 比如，选取option类型第1到2个子元素, 前两个
web.find_element(By.XPATH, "//option[position()<=2]")
"""
css 组选择，表达式之间用','隔开
xpath也有组选择， 是用'|'隔开多个表达式
比如，要选所有的option元素 和所有的 h4 元素，可以使用

//option | //h4  等同于CSS选择器   option , h4
"""

"""----------------父节点和兄弟节点----------------------
# xpath可以选择父节点， 这是css做不到的。
# 某个元素的父节点用 /.. 表示
# 比如，要选择 id 为 china 的节点的父节点，可以这样写 //*[@id='china']/..
# 当某个元素没有特征可以直接选择，但是它有子节点有特征， 就可以采用这种方法，先选择子节点，再指定父节点
  css选择器，要选择某个节点的后续兄弟节点，用'~'
xpath也可以选择后续兄弟节点，用这样的语法 following-sibling::
比如，要选择 class 为 single_choice 的元素的所有后续兄弟节点 //*[@class='single_choice']/following-sibling::*
前面的兄弟节点，用这样的语法 preceding-sibling::
"""
web.quit()

